<?php

// 设置脚本最大执行时间，单位为秒，0表示永不超时
set_time_limit(0);
$address = '127.0.0.1';
$port = 10005;
// 端口可以是1到65535之间的任何数字，前提是未被占用

// 创建并返回一个套接字（通讯节点），一个典型的网络连接由 2 个套接字构成，一个运行在服务器端，另一个运行在客户端
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
  echo "socket_create()failed,reason: " . socket_strerror(socket_last_error()) . "\n";
}

// 绑定socket到具体的主机端口
if (socket_bind($sock, $address, $port) === false) {
  echo "socket_bind() failed,reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

// 监听socket服务器上的请求连接，等待接入
if(socket_listen($sock, 5)  === false)  {
  echo "socket_listen() failed, reason: "  . socket_strerror(socket_last_error($sock))  . "\n";
}

do{
// 确认客户端的连接请求，成功后，返回一个新的子socket句柄（子线程），用于通信
  if(($msgsock = socket_accept($sock))  === false)  {
    echo "socket_accept() failed, reason: " . socket_strerror(socket_last_error($sock))  .  "\n";
    break;
  }

  $msg="Welcome to connect '$address'" . "\n";
// 发送消息（数据）到客户端
  if(false === socket_write($msgsock,$msg, strlen($msg))) {
    echo"socket_write() failed, reason: " .socket_strerror(socket_last_error($sock)) . "\n";
  }

  echo"Read client message \n";
// 读取客户端的数据
  $receivedData = socket_read($msgsock, 8192);
  echo "Received message:" . $receivedData . "\n";

// 将客户端发来的数据，进行处理，然后再发送数据给客户端
  $responseData =  '[time:' . date('Y-m-d H:i:s') . ']' . PHP_EOL . '[data:' . trim($receivedData) . ']';
  if(false === socket_write($msgsock, $responseData, strlen($responseData)))  {
   echo "socket_write()failed,reason: "  . socket_strerror(socket_last_error($sock))  . "\n";
  }

// 关闭连接成功的子socket
  socket_close($msgsock);
}
while(true);

// 关闭等待接入的socket
socket_close($sock);
